package com.itcast.googleplay.protocol;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import com.itcast.googleplay.http.CZApi;
import com.itcast.googleplay.http.HttpHelper;
import com.itcast.googleplay.http.HttpHelper.HttpResult;
import com.itcast.googleplay.utils.UIUtils;
import android.text.TextUtils;

public abstract class BaseProtocol<T>{
	/**
	 * @param url		部分url地址,缺少主机名的部分url
	 * @param index		index分页的索引,0第一页,20第二页
	 * @param parmas	请求需要带上的参数"&key=value"
	 * @return			获取封装成javabean的json数据(从缓存,网络)
	 */
	//"detail-1"
	public T getData(String url,int index,String parmas){
		//从本地缓存获取数据
		String result = getDataFromLocal(url,index,parmas);
		String json;
		if(!TextUtils.isEmpty(result)){
			json = result;
			
		}else{
			//从网络获取数据
			json = getDataFromNet(url,index,parmas);
		}
		return processData(json);
	}

	

	private String getDataFromNet(String url,int index,String params) {
		//1.url后半部分不一样,维护一个参数
		//2.index值有差异(0,20,40)
		//3.参数有差异key=value
		
		//开源框架合集(网络请求框架+图片异步加载框架)
		//框架  xutils httpClient 网络请求框架HttpHelper okhttp  .........
		HttpHelper httpHelper = new HttpHelper();
		//http://127.0.0.1:8090/app?index=0&key=value
		//http://127.0.0.1:8090/detail?packageName=com.youyuan.yyhl
		HttpResult httpResult  = null;
		if(index == -1){
			httpResult = httpHelper.get(CZApi.BASEURL+url+"?"+params);
		}else{
			httpResult = httpHelper.get(CZApi.BASEURL+url+"?index="+index+params);
		}
		if(httpResult!=null){
			//获取服务器返回的json串
			String json = httpResult.getString();
			if(!TextUtils.isEmpty(json)){
				//1.写入本地文件缓存(区分那个连接地址那一页数据的缓存)
				writeToLocal(json, url, index,params);
				//2.因为在调用此方法的地方,已经有做解析过程,所以此次只需要返回json串即可
				return json;
			}
		}
		return "";
	}

	/**
	 * @param url	请求部分链接地址
	 * @param index	 请求上诉链接地址的那一页的数据	url+index确定是那个链接地址的那一页的数据
	 * @return 获取缓存数据方法(从cache文件夹中获取)
	 */
	private String getDataFromLocal(String url,int index,String params) {
		//1.从哪个文件中去获取(指定文件夹,指定是那个连接地址的数据,这个链接地址的那一页的数据)
		//"detail-1"
		File file = new File(UIUtils.getContext().getCacheDir(),url+index+params);
		//2.读取文件的第一行
		BufferedReader bufferedReader = null;
		try {
			bufferedReader = new BufferedReader(new FileReader(file.getAbsolutePath()));
			//3.读取一行,包含了时间戳的第一行
			String lineOne = bufferedReader.readLine();
			//4.将第一行的string类型的数据转换成long类型
			Long invalidTime = Long.valueOf(lineOne);
			//5.比对
			if(System.currentTimeMillis()<invalidTime){
				//6.有效
				String data = null;
				StringBuffer buffer = new StringBuffer();
				while((data = bufferedReader.readLine())!=null){
					buffer.append(data);
				}
				
				return buffer.toString();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				if(bufferedReader!=null){
					bufferedReader.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return "";
	}
	
	
	/**	写入缓存数据方法(cache文件夹中写入)
	 * @param json	存储的内容
	 * @param url	存储文件的部分名称
	 * @param index	 存储文件的部分名称  url+index就能指定是那个连接地址的,那一页的数据.
	 * "detail-1"酷狗音乐
	 */
	private void writeToLocal(String json,String url,int index,String parmas){
		//1.获取文件夹,并且制定缓存文件,具有唯一性url地址
		//制定此文件是那个连接地址的那个一页的缓存数据,分页数据的缓存
		File file = new File(UIUtils.getContext().getCacheDir(),url+index+parmas);
		//2.往文件的第一行,写入此文件的数据有效时间戳
		long currentTimeMillis = System.currentTimeMillis();   //11:28
		//3.写入文件的时间+产品定义的有效时间 = 有效时间戳		//11:28+30分钟 = 11:58之前文件有效
		long invalidTime = currentTimeMillis+30*60*1000;
		//4.写入文件的第一行
		BufferedWriter bufferedWriter = null;
		try {
			bufferedWriter = new BufferedWriter(new FileWriter(file.getAbsolutePath()));
			bufferedWriter.write(invalidTime+"\r\n");
			//将json转换成字符的数组写入文件中
			bufferedWriter.write(json.toCharArray());
			//将缓冲中的数据写入文件
			bufferedWriter.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				if(bufferedWriter!=null){
					bufferedWriter.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public abstract T processData(String json) ;
}
